package com.jishuo.pzk.api;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Author: 姚炜琦
 * @Email: jingcaiqi1225@gmail.com
 * @Date: 2023/9/7 11:02
 * @Package: com.jtyh.controller
 * @NAME: QueryController
 * @Description: 查看凭证图片控制层
 */
@Controller
@RequestMapping("/query")
@Slf4j
public class PictureShow {

    @Autowired
    private HttpServletResponse response;

    @Value("${pzk.pzkFilePath}")
    private String pzkFilePath;

    /**
     * 获取文件的内容
     *
     * @param filePath 文件路径
     * @return 文件内容的字节数组
     * @throws Exception 如果文件过大或者读取文件时发生异常
     */
    public static byte[] getFileContent(String filePath) throws Exception {
        File file = new File(filePath);
        long fileSize = file.length();
        if (fileSize > Integer.MAX_VALUE) {
            log.info("文件太大了...");
            return null;
        }

        try (FileInputStream fis = new FileInputStream(file)) {
            byte[] buffer = new byte[(int) fileSize];
            int offset = 0;
            int numRead;
            while (offset < buffer.length
                    && (numRead = fis.read(buffer, offset, buffer.length - offset)) >= 0) {
                offset += numRead;
            }

            // 确保所有数据均被读取
            if (offset != buffer.length) {
                throw new Exception("无法完整读取文件：" + file.getName());
            }

            return buffer;
        } catch (IOException e) {
            // 处理异常，可以记录日志或者抛出自定义异常
            throw new Exception("读取文件出错：" + file.getName(), e);
        }
    }


    /**
     * 根据文件路径查看文件图片
     *
     * @param fileName 路径
     * @throws Exception 抛出异常
     */
    @GetMapping("/getSrcImg")
    @ResponseBody
    public void getSrcImg(@RequestParam("fileName") String fileName) throws Exception {
        // 创建一个SimpleDateFormat对象，用于格式化日期时间的输出形式
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        // 在日志中记录获取源图片的操作，包括文件名和当前时间
        log.info("getSrcImg, fileName=" + fileName + " " + format.format(new Date()));
        // 根据配置和文件名拼接出完整的文件路径
        String tPath = pzkFilePath + fileName;
        // 获取文件内容
        byte[] data = getFileContent(tPath);
        // 设置response的Content-Type为image/jpg
        response.setContentType("image/jpg");
        // 获取response的输出流
        OutputStream os = response.getOutputStream();
        if (data != null) {
            // 将文件内容写入输出流
            os.write(data);
        }
        // 刷新输出流
        os.flush();
        // 关闭输出流
        os.close();
        // 在日志中记录操作结束时间和当前时间
        log.info("结束" + format.format(new Date()));
    }
}
